﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    public class ServicoDeCliente : IServicoDeCliente
    {
        public void Cadastre( DtoCliente cliente )
        {
            var repositorioDeCliente = FabricaDeRepositorios.Crie<IRepositorioDeCliente>();
            var validadorDeCliente = new ValidadorDeCliente( repositorioDeCliente );
            var clienteObjeto = ConversorDeObjetos.Copie<Cliente>( cliente );

            validadorDeCliente.ValideCadastro( clienteObjeto );

            repositorioDeCliente.Cadastre( clienteObjeto );
        }

        public void Cadastre( DtoCliente cliente, ICollection<DtoDependente> dependentes, ICollection<DtoTelefone> telefones, ICollection<DtoEndereco> enderecos )
        {
            var repositorioDeCliente = FabricaDeRepositorios.Crie<IRepositorioDeCliente>();
            var validadorDeCliente = new ValidadorDeCliente( repositorioDeCliente );
            var clienteObjeto = ConversorDeObjetos.Copie<Cliente>( cliente );

            ICollection<Dependente> deps = new List<Dependente>();
            ICollection<Telefone> tels = new List<Telefone>();
            ICollection<Endereco> ends = new List<Endereco>();

            if (dependentes != null)
            {
                dependentes.ToList().ForEach(e => deps.Add(ConversorDeObjetos.Copie<Dependente>(e)));
                clienteObjeto.Dependentes = deps;
            }
            if (telefones != null)
            {
                telefones.ToList().ForEach(e => tels.Add(ConversorDeObjetos.Copie<Telefone>(e)));
                clienteObjeto.Telefones = tels;
            }
            if (enderecos != null)
            {
                enderecos.ToList().ForEach(e => ends.Add(ConversorDeObjetos.Copie<Endereco>(e)));
                clienteObjeto.Enderecos = ends;
            }

            validadorDeCliente.ValideCadastro( clienteObjeto );

            repositorioDeCliente.Cadastre( clienteObjeto );
        }

        public void Atualize( DtoCliente cliente )
        {
            var repositorioDeCliente = FabricaDeRepositorios.Crie<IRepositorioDeCliente>();
            var validadorDeCliente = new ValidadorDeCliente( repositorioDeCliente );
            var clienteObjeto = ConversorDeObjetos.Copie<Cliente>( cliente );

            validadorDeCliente.ValideAtualizacao( clienteObjeto );

            repositorioDeCliente.Atualize( clienteObjeto );
        }

        public void Exclua( int codigo )
        {
            var repositorioDeCliente = FabricaDeRepositorios.Crie<IRepositorioDeCliente>();
            var validadorDeCliente = new ValidadorDeCliente( repositorioDeCliente );
            var clienteObjeto = ConversorDeObjetos.Copie<Cliente>( repositorioDeCliente.Consulte( codigo ) );

            validadorDeCliente.ValideExclusao( clienteObjeto );

            repositorioDeCliente.Exclua( clienteObjeto );
        }

        public DtoCliente Consulte( int codigo )
        {
            var clienteObjeto = FabricaDeRepositorios.Crie<IRepositorioDeCliente>().Consulte( codigo );

            return ConversorDeObjetos.Copie<DtoCliente>( clienteObjeto );
        }

        public IList<DtoCliente> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoCliente, Cliente>( FabricaDeRepositorios.Crie<IRepositorioDeCliente>().ConsulteTodos() );
        }


    }
}
